home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / GL_OM.ARJ / GL-MAKE.C next >
C/C++ Source or Header  |  1991-03-12  |  3KB  |  125 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /*
  5. From zaphod.mps.ohio-state.edu!sol.ctr.columbia.edu!cunixf.cc.columbia.edu!
  6. cs.columbia.edu!cooper Tue Jan 29 22:07:41 EST 1991
  7.  
  8.  
  9. oops, forgot something important.  here it is:
  10. */
  11.  
  12. /* Directory entry in GL file */
  13. #if 0
  14. struct s_entry {
  15.   long bignum;
  16.   char name[13];
  17. }
  18. #endif
  19.  
  20. /* We don't use it, since some C's make it more than 17 bytes... */
  21.  
  22. main()
  23. {
  24.   short top;  /* size of directory */
  25.   unsigned char *entry;  /* list of directory entries */
  26.   char glfile[100], listfile[100];
  27.   FILE *fp;   /* list of files to join */
  28.   FILE *newfp;  /* the created gl file */
  29.   FILE *oldfp;  /* File we're currently adding */
  30.   int num_ents = 0;  /* number of files to assemble */
  31.   int i;
  32.   short bsize;  /* Size of buffer (see below) */
  33.   long rsize;  /* Size of current file */
  34.   char buff[1024];
  35.   long sofar;  /* Number of bytes written so far */
  36.   /* For referencing fileds in entry table: */
  37.   long *bignum;
  38.   unsigned char *name;
  39.  
  40.   /* Open required files */
  41.  
  42.   printf("GL file to create? "); scanf("%s",glfile);
  43.   printf("list file? "); scanf("%s",listfile);
  44.  
  45.   fp = fopen(listfile,"r");
  46.   if (fp == NULL)
  47.     {
  48.       printf("couldn't open list file %s\n", listfile);
  49.       exit(-1);
  50.     }
  51.   newfp = fopen(glfile,"w");
  52.   if (newfp == NULL)
  53.     {
  54.       fclose(fp);
  55.       printf("couldn't create GL file %s\n", glfile);
  56.       exit(-1);
  57.     }
  58.  
  59.   /* Just count the number of files, to make directory */
  60.   while(1)
  61.     {
  62.       i = fscanf(fp,"%s",buff);
  63.       if (i <= 0 || buff[0] == 0)
  64.     break;
  65.       num_ents++;
  66.     }
  67.  
  68.   rewind(fp);
  69.  
  70.   top = (num_ents+1) * 17;
  71.   /* Allocate space for directory */
  72.   entry = (unsigned char *)calloc(top, 1);
  73.  
  74.   /* Write directory size... */
  75.   fwrite(&top, 2, 1, newfp);
  76.   /* But leave blank until we get all info */
  77.   fseek(newfp, (long)top, 1);
  78.   sofar = top+2;
  79.  
  80.   /* Process each file */
  81.   bignum = (long *)entry;
  82.   name = entry+4;
  83.   for (i = 0; i < num_ents; i++, name+=17, bignum = (long *)(name-4))
  84.     {
  85.       fscanf(fp,"%s",buff);  /* read file naame */
  86.       oldfp = fopen(buff,"r");  /* open the file */
  87.       if (oldfp == NULL)
  88.     {
  89.       fclose(fp);
  90.       fclose(newfp);
  91.       free(name);
  92.       free(bignum);
  93.       printf("Can't read file %s : aborting \n", buff);
  94.       exit(-1);
  95.     }
  96.       /* Make directory entry */
  97.       strcpy(name, buff);
  98.       *bignum = sofar;
  99.  
  100.       /* Copy file to gl file, one buffer at a time, */
  101.       /* Accumulating size */
  102.       rsize = 0;
  103.       while(1)
  104.     {
  105.       bsize = fread(buff, 1, sizeof(buff), oldfp);
  106.       fwrite(buff, bsize, 1, newfp);
  107.       rsize += bsize;
  108.       if (bsize < sizeof(buff))
  109.         break;
  110.     }
  111.       sofar += rsize;
  112.       fclose(oldfp);
  113.     }
  114.  
  115.   fclose(fp);
  116.  
  117.   /* Now write directory */
  118.   fseek(newfp, 2L, 0);
  119.   fwrite(entry, top, 1, newfp);
  120.  
  121.   fclose(newfp);
  122.   free(entry);
  123. }
  124.  
  125.